﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace eService.BLL
{
    public class ExecuteNHAPKHO
    {
        eServiceEntities dbEntities;
        IExecuteData<REPLINK> ExeChiTiet;
        IExecuteData<REPLIST> ExeHoaDon;

        ExcuteNHACUNGCAP exeNCC = new ExcuteNHACUNGCAP();
        ExcuteNHOMHANG exeNhomHang = new ExcuteNHOMHANG();
        ExcuteKHO exeKho = new ExcuteKHO();
        ExcuteDONVI exeDonVi = new ExcuteDONVI();
        ExcuteHANGHOA exeMatHang = new ExcuteHANGHOA();

        public string ErrMsg { get; set; }
        public bool KQ { get; set; }

        public ExecuteNHAPKHO()
        {
            dbEntities = ConnectionProvider.getDbEntities();
            ExeChiTiet = new ExecuteData<REPLINK>(dbEntities);
            ExeHoaDon = new ExecuteData<REPLIST>(dbEntities);
        }
       
        //---Add, Update, Delete HoaDon (Replist)
        public REPLIST GetByID(string ID)
        {
            REPLIST u = ExeHoaDon.GetById(ID);
            if (u == null)
                return null;
            else KQ = true;
            return u;
        }
        public List<REPLIST> GetAllRepList()
        {
            List<REPLIST> list = (List<REPLIST>)ExeHoaDon.GetAll();
            if (list != null && list.Count > 0) KQ = true;
            return list;
        }
        public bool Add_HoaDon(REPLIST HoaDon)
        {
            KQ = false;
            if (HoaDon != null)
            {
                KQ = ExeHoaDon.Insert(HoaDon);
                if (KQ)
                    ErrMsg = "Thêm hóa đơn mới thành công!";
                else
                    ErrMsg = "Không thể thêm hóa đơn mới!";
            }
            else
            {
                ErrMsg = "Vui lòng nhập thông tin đầy đủ!";
            }
            return KQ;
        }
        public bool Update_HoaDon(REPLIST HoaDon)
        {
            KQ = false;
            if (HoaDon != null)
            {
                REPLIST HoaDonOld = dbEntities.REPLISTs.Find(HoaDon.RepID);
                KQ = ExeHoaDon.Update(HoaDon,HoaDonOld);
                if (KQ)
                    ErrMsg = "Cập nhật hóa đơn mới thành công!";
                else
                    ErrMsg = "Không thể Cập nhật  hóa đơn mới!";
            }
            else
            {
                ErrMsg = "Vui lòng nhập thông tin đầy đủ!";
            }
            return KQ;
        }
        public bool Delete(REPLIST HoaDon)
        {
            KQ = false;
            if (HoaDon != null)
            {
                REPLIST obj = dbEntities.REPLISTs.Find(HoaDon.RepID);
                if (obj != null)
                {
                    KQ = ExeHoaDon.Delete(obj);
                    if (KQ)
                        ErrMsg = "xoá hóa đơn thành công!";
                    else
                        ErrMsg = "Không thể xoá hóa đơn !";
                }
            }
            else
            {
                ErrMsg = "Vui lòng chọn hóa đơn !";
            }
            return KQ;
        }
        public REPLIST LoadValuesRepList(string MaHoaDon, string MaKho, string GhiChu, string MaNguoiLap, float TongTien, string TrangThaiHD, int MaNhaCungCap, float TienChi, float TienKhuyenMai, float ChietKhau, int HinhThucNhap)
        {
            KQ = false;
            string TenNCC="",DiaChi="",DienThoai="";
            DateTime NgayLap = DateTime.Today;
            DateTime GioLap = DateTime.Now;
            Int32 SlHoaDon = ExeHoaDon.GetAll().Count+1;
            float TienChietKhau = TongTien * ChietKhau;
            PARTNERINFO objP = exeNCC.GetByID(MaNhaCungCap);
            if(objP!=null)
            {
                TenNCC=objP.Name;
                DiaChi = objP.Address;
                DienThoai=objP.Phone;
            }
            REPLIST obj = new REPLIST();
            if (MaHoaDon != "" && MaKho!="" && MaNguoiLap!="" && MaNhaCungCap>0)
            {
                obj.RepID = MaHoaDon;
                obj.WHID = MaKho;
                obj.Note = GhiChu;
                obj.EmpID = MaNguoiLap;
                obj.TotalMoney = TongTien;
                obj.EditStatus = TrangThaiHD;
                obj.PartnerID = MaNhaCungCap;
                obj.TotalPay = TienChi;
                obj.DiscountMoney = TienKhuyenMai;
                obj.DiscountPercent = ChietKhau;
                obj.MoneyDiscountPercent = TienChietKhau;
                obj.TypeInput = (byte)HinhThucNhap;
                obj.Name = TenNCC;
                obj.Adress = DiaChi;
                obj.Phone = DienThoai;
                obj.DateReal = GioLap;
                obj.RepDate = NgayLap;
                obj.CountOrder = SlHoaDon;
                KQ = true;
            }
            else
            {
                obj = null;
                ErrMsg = "Vui lòng điền đầy đủ thông tin!";
            }
            return obj;
        }

        //---Add, Update, Delete Chi Tiet (RepLink)
        public REPLINK GetByID(int ID)
        {
            REPLINK u = ExeChiTiet.GetById(ID);
            if (u == null)
                return null;
            else KQ = true;
            return u;
        }
        public List<REPLINK> GetAllByRepID(string RepID)
        {
            List<REPLINK> list = (List<REPLINK>)ExeChiTiet.GetAll().Where(c => c.RepID == RepID).ToList();
            if (list != null && list.Count > 0) KQ = true;
            return list;
        }
        public bool Add_HoaDon(REPLINK ChiTiet)
        {
            KQ = false;
            if (ChiTiet != null)
            {
                KQ = ExeChiTiet.Insert(ChiTiet);
                if (KQ)
                    ErrMsg = "Thêm mặt hàng vào hóa đơn thành công!";
                else
                    ErrMsg = "Không thể thêm mặt hàng vào hóa đơn!";
            }
            else
            {
                ErrMsg = "Vui lòng nhập thông tin đầy đủ!";
            }
            return KQ;
        }
        public bool Update_HoaDon(REPLINK ChiTiet)
        {
            KQ = false;
            if (ChiTiet != null)
            {
                REPLINK ChiTietOld = dbEntities.REPLINKs.Find(ChiTiet.ID);
                KQ = ExeChiTiet.Update(ChiTiet, ChiTietOld);
                if (KQ)
                    ErrMsg = "Cập nhật hóa đơn mới thành công!";
                else
                    ErrMsg = "Không thể Cập nhật  hóa đơn mới!";
            }
            else
            {
                ErrMsg = "Vui lòng nhập thông tin đầy đủ!";
            }
            return KQ;
        }
        public bool Delete(REPLINK ChiTiet)
        {
            KQ = false;
            if (ChiTiet != null)
            {
                REPLINK obj = dbEntities.REPLINKs.Find(ChiTiet.RepID);
                if (obj != null)
                {
                    KQ = ExeChiTiet.Delete(obj);
                    if (KQ)
                        ErrMsg = "xoá mặt hàng trong hóa đơn thành công!";
                    else
                        ErrMsg = "Không thể xoá mặt hàng trong hóa đơn !";
                }
            }
            else
            {
                ErrMsg = "Vui lòng chọn mặt hàng trong hóa đơn!";
            }
            return KQ;
        }
        public REPLINK LoadValuesRepLink(int MaChitiet,string MaHoaDon,int MaMatHang,int SoLuongNhap,int MaNhaCungCap,string MaKho,int SoThuThu)
        {
            KQ = false;
            string TenMatHang = "", DonVi = "";
            double ThanhTien = 0, DonGia = 0;
            DateTime NgayLap = DateTime.Today;
            DateTime GioLap = DateTime.Now;
            //List<REPLINK> list = GetAllByRepID(MaHoaDon);
            //if (list != null) SoThuTu = list.Count + 1;
            PRODUCT objP = exeMatHang.GetByID(MaMatHang);
            if (objP != null)
            {
                TenMatHang = objP.PrName;
                DonGia = (double)objP.PrPriceBase;
                ThanhTien = DonGia * SoLuongNhap;
                UNITPRODUCT objDV = exeDonVi.GetByID(objP.PrUnitID);
                if (objDV != null) DonVi = objDV.UnitName;
            }
            REPLINK obj = new REPLINK();
            if (MaHoaDon != "" && MaMatHang > 0 && SoLuongNhap > 0 && MaNhaCungCap > 0 && MaKho != "")
            {
                obj.ID = MaChitiet;
                obj.Number = SoLuongNhap;
                obj.OrderNumber = SoThuThu;
                obj.PartnerID = MaNhaCungCap;
                obj.PrDonViTinh = DonVi;
                obj.PrID = MaMatHang;
                obj.PrName = TenMatHang;
                obj.RepID = MaHoaDon;
                obj.StandPrice = DonGia;
                obj.WHID = MaKho;
                obj.TotalMoney = ThanhTien;
                obj.DateReal = GioLap;
                obj.DateStart = NgayLap;
                KQ = true;
            }
            return obj;
        }

        //--Proceduce Xu Ly Nhap mat hang vao phieu
        public bool XuLyNghiepVu(string MaPhieu,int MaChiTiet,int MaMatHang,int SoLuongNhap,double DonGia,int MaNCC,string MaKho,float ChietKhau,double TienKhuyenMai,double SoTienChi,string MaNguoiLap,string TrangThaiPhieu,int HinhThucNhap,string GhiChu,bool DaSuaDoi,string MaPhieuTao, string ThaoTac)
        {
            IDbTransaction trans = null;
            SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
            try { if (con.State != ConnectionState.Open)  con.Open(); }
            catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

            KQ = false;
            try
            {
                trans = con.BeginTransaction();
                IDbCommand cmd = con.CreateCommand();
                cmd.CommandText = "exec NhapVaoPhieu '" + MaPhieu + "','" + MaChiTiet + "','" + MaMatHang + "','" + SoLuongNhap + "','" + DonGia + "','" + MaNCC + "','" + MaKho + "','" + ChietKhau + "','" + TienKhuyenMai + "','" + SoTienChi + "','" + MaNguoiLap + "',N'" + TrangThaiPhieu + "','" + HinhThucNhap + "',N'" + GhiChu + "','" + DaSuaDoi + "','"+MaPhieuTao+"','"+ThaoTac+"'";
                cmd.Transaction = trans;
                cmd.ExecuteNonQuery();
                trans.Commit();
                ErrMsg = "Thành công!";
                KQ = true;
            }
            catch
            {
                if (trans != null)
                    trans.Rollback();
            }
            finally
            {
                if (con.State != ConnectionState.Closed)
                    con.Close();
            }
            return KQ;
        }
        public DataTable HoaDon(string MaHoaDon)
        {
            DataTable data = null;
            try
            {
                SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

                string sql = "Select re.RepID,re.ID,re.PrID,pr.PrName,re.Number,un.UnitName,re.StandPrice,re.TotalMoney from REPLINK_TEMP re,PRODUCTS pr,UNITPRODUCT un WHERE re.PrID = pr.PrID and pr.PrUnitID=un.UnitID and re.RepID='" + MaHoaDon + "'";
                
                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                data = new DataTable();
                sda.Fill(data);
                if (data != null && data.Rows.Count > 0) ErrMsg = " Tải phiếu thành công!";
                else ErrMsg = " Tải phiếu thất bại!";
            }
            catch
            { }
            return data;
        }
        public int SoLuongHienTai(string MaHoaDon,int MaMatHang)
        {
            int soluong = 0;
            try
            {
                SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

                string sql = "Select re.Number from REPLINK_TEMP re WHERE re.PrID='"+MaMatHang+"' and re.RepID='" + MaHoaDon + "'";

                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataTable data = new DataTable();
                sda.Fill(data);
                if (data != null && data.Rows.Count > 0) soluong = int.Parse(data.Rows[0][0].ToString());
                else ErrMsg = "Lấy số lượng hiện tại thất bại!";
            }
            catch
            { }
            return soluong;
        }
        public int SoLuongPhieuNhap()
        {
            int soluong = 0;
            try
            {
                SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

                string sql = "Select COUNT(RepID) as SoLuongPhieu FROM REPLIST";

                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataTable data = new DataTable();
                sda.Fill(data);
                if (data != null && data.Rows.Count > 0) soluong = int.Parse(data.Rows[0][0].ToString());
                else ErrMsg = "Lấy số lượng thất bại!";
            }
            catch
            { }
            return soluong;
        }
        public decimal TongThanhTien(string MaHoaDon)
        {
            decimal TongTien = 0;
            try
            {
                SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

                string sql = "Select SUM(re.TotalMoney) as TongTien from REPLINK_TEMP re WHERE re.RepID='" + MaHoaDon + "'";

                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataTable data = new DataTable();
                sda.Fill(data);
                if (data != null && data.Rows.Count > 0) TongTien = int.Parse(data.Rows[0][0].ToString());
                else ErrMsg = "Lấy tổng tiền thất bại!";
            }
            catch
            { }
            return TongTien;
        }

        public bool XoaPhieuTam()
        {
            IDbTransaction trans = null;
            SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
            try { if (con.State != ConnectionState.Open)  con.Open(); }
            catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

            KQ = false;
            try
            {
                trans = con.BeginTransaction();
                IDbCommand cmd = con.CreateCommand();
                cmd.CommandText = "DELETE REPLINK_TEMP DELETE REPLIST_TEMP";
                cmd.Transaction = trans;
                cmd.ExecuteNonQuery();
                trans.Commit();
                KQ = true;
                ErrMsg = "Xóa phiếu thành công!";
            }
            catch
            {
                if (trans != null)
                    trans.Rollback();
                ErrMsg = "Xóa phiếu thất bại!";
            }
            finally
            {
                if (con.State != ConnectionState.Closed)
                    con.Close();
            }
            return KQ;
        }
        public bool XoaMatHang(string MaHoaDon,int MaMatHang)
        {
            IDbTransaction trans = null;
            SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
            try { if (con.State != ConnectionState.Open)  con.Open(); }
            catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

            KQ = false;
            try
            {
                trans = con.BeginTransaction();
                IDbCommand cmd = con.CreateCommand();
                cmd.CommandText = "DELETE REPLINK_TEMP WHERE RepID='"+MaHoaDon+"' and PrID = '"+MaMatHang+"'";
                cmd.Transaction = trans;
                cmd.ExecuteNonQuery();
                trans.Commit();
                KQ = true;
                ErrMsg = "Xóa mặt hàng thành công!";
            }
            catch
            {
                if (trans != null)
                    trans.Rollback();
                ErrMsg = "Xóa mặt hàng thất bại!";
            }
            finally
            {
                if (con.State != ConnectionState.Closed)
                    con.Close();
            }
            return KQ;
        }

        public bool TaoPhieuNhap(string MaHoaDon,int MaNCC, double TongTien,double ChietKhau,double TienChietKhau,double TienKhuyenMai, double TienChi)
        {
            IDbTransaction trans = null;
            SqlConnection con = (SqlConnection)ConnectionProvider.ServerConnection;
            try { if (con.State != ConnectionState.Open)  con.Open(); }
            catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

            KQ = false;
            try
            {
                trans = con.BeginTransaction();
                IDbCommand cmd = con.CreateCommand();
                cmd.CommandText = " UPDATE REPLIST_TEMP set TotalMoney='" + TongTien + "',PartnerID='" + MaNCC + "',DiscountPercent='" + ChietKhau + "',MoneyDiscountPercent='" + TienChietKhau + "',DiscountMoney='"+TienKhuyenMai+"',"
                                +" INSERT INTO REPLIST SELECT * FROM REPLIST_TEMP WHERE RepID='" + MaHoaDon + "'" 
                                + " INSERT INTO REPLINK SELECT * FROM REPLINK_TEMP WHERE RepID='" + MaHoaDon + "'";
                cmd.Transaction = trans;
                cmd.ExecuteNonQuery();
                trans.Commit();
                KQ = true;
                ErrMsg = "Tạo phiếu thành công!";
            }
            catch
            {
                if (trans != null)
                    trans.Rollback();
                ErrMsg = "Tạo phiếu thất bại!";
            }
            finally
            {
                if (con.State != ConnectionState.Closed)
                    con.Close();
            }
            return KQ;
        }
    }
}
